/**
 * Ascensor.h
 *
 */

#ifndef ASCENSOR_H_
#define ASCENSOR_H_

#include <iostream>
#include <vector>
#include <list>

#include "../Configuracion/Estructuras.h"
#include "../Configuracion/Constantes.h"
#include "../Seniales/SignalHandler.h"
#include "../Configuracion/Utils.h"
#include "../Mensajes/Cola.h"
#include "../Logger/Log.h"

using namespace std;

class Ascensor : public EventHandler {

private:
	int numero;
	int velocidad;
	unsigned int capacidad;
	int cantidadPisos;
	int pisoActual;
	char modo;
	bool cumplirLlamadas;
	list<Persona> personas;
	list<Llamada> llamadas;
	vector<list<Persona> > cantidadSubieron;
	vector<list<Persona> > cantidadBajaron;
	Cola<Llamada> colaMsgControlador;
	vector<Cola<Persona> > colasPisos;

	void leerLlamada();
	void analizarLlamadas();
	void arriboPiso();
	bool hayLlamadaPisoAbajo();
	bool hayLlamadaPisoArriba();
	bool hayLlamadaPisoActual();
	int getTiempoEntrePisos();
	void decidirSiguienteModo();
	void bajarPersonas();
	void subirPersonas();
	void mostrarReportePersonasSubieron(list<Persona> lista);
	void mostrarReportePersonasBajaron(list<Persona> lista);
	void mostrarReporte();
	void avisarControladorEstado();
	string getStringModo();


public:

	Ascensor(int numero, int velocidad, int capacidad, int cantidadPisos );

	virtual ~Ascensor();
	int inicializar();
	void funcionar();
	int handleSignal ( int signum );

};

#endif /* ASCENSOR_H_ */
